import { initMixin } from "./init";
import { stateMixin } from "./state";
import { renderMixin } from "./render";
import { eventsMixin } from "./events";
import { lifecycleMixin } from "./lifecycle";
import { warn } from "../util/index";

// Vue的构造函数
/**
 * 此处为什么不用 class 的语法？
 * 
 * 因为我们在构造函数外部需要在Vue的原型上挂载更多的成员，用class会显得不搭调
 */
function Vue(options) {
  if (
    process.env.NODE_ENV !== "production" &&
    !(this instanceof Vue) // 判断this是否是new出来的实例
  ) {
    warn("Vue is a constructor and should be called with the `new` keyword");
  }
  //   调用init方法
  this._init(options);
}
// 注册init方法
initMixin(Vue);
// 注册 $data $props $set $delete $watch
stateMixin(Vue);
// 注册事件相关的方法 $on $once $off $emit
eventsMixin(Vue);
// 注册生命周期相关的实例方法 _update $forceUpdate $destroy
lifecycleMixin(Vue);
// 注册 $nextTick _render
renderMixin(Vue);

export default Vue;
